import uiautomation as auto
from uiautomation import Control

from utils.handle_path import config_path, data_path
from utils.handle_yaml import get_yaml_data


class BaseControl(Control):

    def getControl_old(self,control_type: str,control: Control,**kwargs)  -> 'Control':
        """
        封装获取控件的方法，基于父控件control去查询其下的类型为control_type，查询条件为kwargs的控件
        :param control_type: 要查询控件的类型，String型
        :param control: 父级控件对象
        :param kwargs: 查询条件，如：Name='notepad',searchDepth=2
        :return: 返回查询到的控件对象，查询不到就返回错误
        """
        # 目前所有控件组成的字典，可以改成从yaml中读取过来
        CONTROL_DICT = {'ButtonControl': Control.ButtonControl(control,**kwargs),
                        'CheckBoxControl': Control.CheckBoxControl(control,**kwargs),
                        'MenuItemControl': Control.MenuItemControl(control,**kwargs),
                        'MenuControl': Control.MenuControl(control,**kwargs),
                        'WindowControl': Control.WindowControl(control,**kwargs),
                        'TreeControl': Control.TreeControl(control,**kwargs),
                        'TreeItemControl': Control.TreeItemControl(control,**kwargs),
                        'MenuBarControl': Control.MenuBarControl(control,**kwargs),
                        'CalendarControl': Control.CalendarControl(control,**kwargs),
                        'ComboBoxControl': Control.ComboBoxControl(control,**kwargs),
                        'DataGridControl': Control.DataGridControl(control,**kwargs),
                        'DataItemControl': Control.DataItemControl(control,**kwargs),
                        'DocumentControl': Control.DocumentControl(control,**kwargs),
                        'EditControl': Control.EditControl(control,**kwargs),
                        'GroupControl': Control.GroupControl(control,**kwargs),
                        'HeaderControl': Control.HeaderControl(control,**kwargs),
                        'HeaderItemControl': Control.HeaderItemControl(control,**kwargs),
                        'HyperlinkControl': Control.HyperlinkControl(control,**kwargs),
                        'ImageControl': Control.ImageControl(control,**kwargs),
                        'ListControl': Control.ListControl(control,**kwargs),
                        'ListItemControl': Control.ListItemControl(control,**kwargs),
                        'PaneControl': Control.PaneControl(control,**kwargs),
                        'ProgressBarControl': Control.ProgressBarControl(control,**kwargs),
                        'RadioButtonControl': Control.RadioButtonControl(control,**kwargs),
                        'ScrollBarControl': Control.ScrollBarControl(control,**kwargs),
                        'SemanticZoomControl': Control.SemanticZoomControl(control,**kwargs),
                        'SeparatorControl': Control.SeparatorControl(control,**kwargs),
                        'SliderControl': Control.SliderControl(control,**kwargs),
                        'SpinnerControl': Control.SpinnerControl(control,**kwargs),
                        'SplitButtonControl': Control.SplitButtonControl(control,**kwargs),
                        'StatusBarControl': Control.StatusBarControl(control,**kwargs),
                        'TabControl': Control.TabControl(control,**kwargs),
                        'TabItemControl': Control.TabItemControl(control,**kwargs),
                        'TableControl': Control.TableControl(control,**kwargs),
                        'TextControl': Control.TextControl(control,**kwargs),
                        'ThumbControl': Control.ThumbControl(control,**kwargs),
                        'TitleBarControl': Control.TitleBarControl(control,**kwargs),
                        'ToolBarControl': Control.ToolBarControl(control,**kwargs),
                        'ToolTipControl': Control.ToolTipControl(control,**kwargs),
                        }
        for type,ctrl in CONTROL_DICT.items():
            if type == control_type:
                return eval(ctrl)

    def getControl(self,control_type: str,control: Control, **kwargs)  -> 'Control':
        """
        做了数据分离，控件类型存在yaml中
        封装获取控件的方法，基于父控件control去查询其下的类型为control_type，查询条件为kwargs的控件
        :param control_type: 要查询控件的类型，String型
        :param control: 父级控件对象
        :param kwargs: 查询条件，如：Name='notepad',searchDepth=2
        :return: 返回查询到的控件对象，查询不到就返回错误
        """
        CONTROL_DICT = get_yaml_data(config_path+'/ctrl_conf.yaml')['CONTROL_DICT']

        for type,ctrl in CONTROL_DICT.items():
            if type == control_type:
                return eval(ctrl)

    def getControl_yaml(self,locator):
        # 不好用，因为父级control不好确定，不能写死名称
        locator1 = eval(locator)[0]
        locator2 = eval(locator)[1]
        return self.getControl(*locator1,**locator2)

if __name__ == '__main__':
    window = auto.WindowControl(ClassName='CCNotePad')
    # l,o = ('MenuItemControl',window),{'Name':'查找(S)'} # 是否能做成数据分离，第一版先不做
    control_locator = get_yaml_data(data_path + '/allelement/newplat_element.yaml')
    search_loactor = control_locator['search']
    # args, kwargs = eval(control_locator)[0], eval(control_locator)[1]
    # c1 = BaseControl().getControl(*args,**kwargs)
    # c1 = BaseControl().getControl('MenuItemControl',window,Name='查找(S)')

    c1 = BaseControl().getControl_yaml(search_loactor)
    print(c1.GetNextSiblingControl().Name)

    # print(window.MenuItemControl(Name='查找(S)').GetNextSiblingControl().Name)